package common.model.Entity.libraryEntity.enums;

/**
 * 预约记录状态枚举。
 *
 * <p>与数据库字段 {@code status} 整数代码显式映射，保证序列化/反序列化一致性。</p>
 */

public enum ReserveStatus {

    /**
     * 排队中：已预约但尚未轮到。
     */
    WAITING(0),

    /**
     * 已通知取书：图书已为该用户保留，不可被其他用户借阅。
     */
    NOTIFIED(1),

    /**
     * 该条预约记录已过期。
     */
    EXPIRED(2),

    /**
     * 用户主动取消预约。
     */
    CANCELLED(3),

    /**
     * 用户已取书，预约记录转为借阅记录。
     */
    PICKED_UP(4);

    /**
     *  数据库中存储的整数代码。
     */
    private final int code;

    /**
     * 获取与该枚举常量关联的整数代码。
     *
     * @param code 数据库整数代码
     */
    ReserveStatus(int code) {
        this.code = code;
    }

    /**
     * 获取与该枚举常量关联的整数代码。
     * @return  数据库中使用的整数代码
     */
    public int getCode() {
        return code;
    }

    /**
     * 根据数据库整数代码获取对应的 {@code ReserveStatus} 枚举。
     *
     * @param code 数据库中存储的整数值
     * @return 对应的枚举，若代码无效则返回 {@code null}
     */
    public static ReserveStatus fromCode(int code) {
        switch (code) {
            case 0: return WAITING;
            case 1: return NOTIFIED;
            case 2: return EXPIRED;
            case 3: return CANCELLED;
            case 4: return PICKED_UP;
            default: return null;
        }
    }

    /**
     * 根据字符串名称获取对应的 {@code ReserveStatus} 枚举。
     *
     * @param value 字符串值（忽略大小写）
     * @return 对应的枚举，若无匹配则返回 {@code null}
     */
    public static ReserveStatus fromString(String value) {
        if (value != null) {
            for (ReserveStatus status : ReserveStatus.values()) {
                if (status.name().equalsIgnoreCase(value)) {
                    return status;
                }
            }
        }
        return null;
    }
}
